package com.generic.mybatis.dal.dao;

import com.generic.mybatis.dal.dao.criteria.Criteria;
import com.generic.mybatis.dal.dao.page.Pageable;

import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 提供最基础的操作
 *
 * @author wuaj
 */
public interface GenericDao<T, PK> extends GenericOperation {

    @Select(GET_ONE_BY_ID)
    T getOneById(PK id);

    @Select(GET_ONE)
    T getOne(T entity);

    @Insert(INSERT)
    void insert(T t);

    @Update(UPDATE)
    void update(T entity);

    @Delete(DELETE_BY_ID)
    void deleteById(PK id);

    @Delete(DELETE)
    void delete(T entity);

    @Select(FIND_ALL)
    List<T> findAll();

    @Select(FIND)
    List<T> find(Criteria... criterias);

    @Select(FIND_ONE)
    T findOne(Criteria... criterias);

    @Select(FIND)
    List<T> findLock(Criteria... criterias);

    @Select(FIND_ONE)
    T findOneLock(Criteria... criterias);

    @Select(FIND_BY_PAGE)
    List<T> findByPage(Pageable pageable, Criteria... criterias);

    @Select(COUNT)
    int count(Criteria... criterias);

    @Select(SUM)
    Integer sum(@Param("sumField") String sumField, @Param("criterias") Criteria... criterias);

}
